package Demo6;

import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-12
 * Time: 12:57
 */
/*
6. 封装
 */
/*public class Test {
    //6.1封装的概念
    //面向对象程序设计三大特性：封装、继承、多态。而类和对象阶段，主要研究的就是封装特性。何为封装呢？简单来说
    //就是套壳屏蔽细节。
    //封装：将数据和操作数据的方法进行了有机结合，隐藏对象的属性和实现的细节，仅对外公开接口来和对象进行交互

    //6.2访问限定符
    *//*
    Java中主要通过类和访问权限来实现封装：类可以将数据以及封装数据的方法联系在一起，更符合人类对事物的认
    知，而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符：
    比如：
    public：可以理解为一个人的外貌特性，谁都可以看得到
    default：对于自己家族中(同一个包)不是什么秘密，对于其他人来说就是隐私了
    private：只有自己知道，其他人都不知道
    【说明】
    - protected主要使用在继承中(在继承的章节中详细介绍)
    - default限定指：什么都不写时的默认权限
    - 访问权限除了可以限定类中成员的可见性，也可以控制类的可见性
     *//*
}*/

class Computer {
    private String cpu;//cpu
    private String memory;//内存
    public String screen;//屏幕
    String brand;//品牌 -> default属性

    public Computer(String cpu, String memory, String screen, String brand) {
        this.cpu = cpu;
        this.memory = memory;
        this.screen = screen;
        this.brand = brand;
    }
    public void Boot() {
        System.out.println("开机...");
    }

    public void PowerOff() {
        System.out.println("关机...");
    }
    public void SurInternet() {
        System.out.println("上网...");
    }
}
public class Test {
    public static void main(String[] args) {
        Computer computer = new Computer("i9", "16", "13*14", "QTl");
        System.out.println(computer.brand);//default属性：只能在本包中类访问
        System.out.println(computer.screen);//public属性：可以任何其他类型访问
        //System.out.println(computer.cpu);//private属性：只能在Computer类中访问，不能被其他类访问
    }
}
//注意：一般情况下成员变量设置成private，成员方法去设置成public。

//6.封装扩展之包
//6.3.1包的概念
//为了更好地管理类，把多个类收集在一起成为一组，称为软件包。有点类似目录。

//在Java中也引入了包，包是对类、接口等封装机制的体现，是一种对类或者接口等很好的组织方式，比如：一
//个包中的类不想被其他包中的类使用。包还有一个重要的作用：在同一个工程中允许、存在相同名称的类，只要处在不同的包中即可。

//6.3.2 导入包中的类
//Java 中已经提供了很多现成的类供我们使用. 例如Date类：可以使用 java.util.Date 导入 java.util 这个包中的 Date
//类.
class Test1 {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
        //得到了一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}
//但是这种写法比较麻烦，可以使用import语句导入包
//import java.util.Date;
class Test2 {
    public static void main(String[] args) {
        Date date = new Date();
        // 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}

//如需要要使用java.util中的其他类，可以使用import.java.util.*;
//import java.util.*;
class Test3 {
    public static void main(String[] args) {
        Date date = new Date();
        // 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}
//但是建议显示的指定要导入的包，否则还是容易出现冲突的情况。

/*
import java.util.*;
        import java.sql.*;
public class Test {
    public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
        Date date = new Date();
        System.out.println(date.getTime());
    }
}
// 编译出错
Error:(5, 9) java: 对Date的引用不明确
        java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配*/

//在这种情况下使用完整的类名

//6.3.3自定义包
/*
基本规则
 - 在文件的最上方加上一个package语句指定该代码在哪个包中。
 - 包名需要尽量指定成唯一的名字，通常会用公司的域名的颠倒形式(com.baidu.yiyan.demo1)。
 - 包名要和代码的路径相匹配，例如创建com.baidu.yiyan.demo1的包，那么会存在一个对应的路径com/baidu/yiyan/demo1来储存代码。
 - 如果一个类没有package语句，则该类被放到一个默认包中。
 */

//6.3.4包的访问权限控制举例

//6.3.5常见的包
/*
1. java.lang：系统常用基础类(String、Object)，此包从JDK1.1后自动导入。
2. java.lang.reflect:java 反射编程包。
3. java..net：进行网络编程开发包。
4. java.sql：进行数据库开发的支持包。
5. java.util：是java提供的工具程序包。（集合类等）非常重要
6. java.io:I/O编程开发包。
 */

